#include "head.h"

/*预定义*/
void *report_thread(void *arg);//上报线程
void *data_storage_thread(void *arg);//数据存储线程
pthread_mutex_t mutex;//lock

int main(int argc, char const *argv[])
{
    pthread_mutex_init(&mutex,NULL);
    // 解析点表信息
    parse_point_table();
    // 连接mqtt服务器
    connect_to_mqtt_server();
    // 创建数据库
    sqllite_init();
    // 创建线程
    pthread_t pid1, pid2;
    int ret = pthread_create(&pid1, NULL, report_thread, NULL);
    if (ret != 0)
    {
        perror("pthread creat pid1 error");
        return -1;
    }
    ret = pthread_create(&pid2, NULL, data_storage_thread, NULL);
    if (ret != 0)
    {
        perror("pthread creat pid2 error");
        return -1;
    }

    // 等待回收线程资源
    pthread_join(pid1, NULL);
    pthread_join(pid2, NULL);

    delete_clear();
    return 0;
}
// 上报线程
void *report_thread(void *arg)
{
    //获取上报方式
    extern int sbtype;
    // 获取周期
    extern int period;
    // 判断上报方式
    while (1)
    {
        switch (sbtype)
        {
        // case 0: // 刷新上报---当识别到指令时上报
        //     break;
        case 1: // 变化上报
            change_reporting();
            break;
        case 2: // 周期上报
            // 按周期轮寻共享内存上报
           sleep(period);
            {
                periodic_reporting();
            }
            break;
        default:
            break;
        }
    }
}
// 数据存储线程
void *data_storage_thread(void *arg)
{
    while (1)
    {
        pthread_mutex_lock(&mutex);
        // 循环共享内存，存储数据库
        
        data_storage();//存储数据

        // 解锁，允许其他线程访问共享资源
        pthread_mutex_unlock(&mutex);

        sleep(60);//1min上传一次数据库
    }
}
